# import socket
# import json
#
# # -------------------------- 1. 搜索交互逻辑（替换原天气查询输入） --------------------------
# def get_user_input(input_user) -> tuple[str, int]:
#     """获取用户输入：解析关键词和分页（格式支持“关键词”或“关键词 page=2”）"""
#     user_input = input_user
#     if user_input.lower() == "quit":
#         return ("quit", 1)
#
#     # 解析分页（如“Python page=2” → 关键词=Python，页码=2）
#     parts = user_input.split(" page=")
#     keyword = parts[0].strip()
#     page = 1  # 默认第1页
#     if len(parts) == 2 and parts[1].isdigit():
#         page = int(parts[1].strip())
#
#     return (keyword, page)
#
# # -------------------------- 2. 展示搜索结果（替换原天气展示） --------------------------
# def show_search_result(resp_data: dict):
#     """解析服务器响应并格式化展示结果"""
#     if resp_data["status"] == "error":
#         print(f"❌ 错误：{resp_data['msg']}")
#         return
#
#     results = resp_data["data"]
#     page = resp_data["page"]
#     has_more = resp_data["has_more"]
#
#     if not results:
#         print(f"❌ 第{page}页未找到与'{resp_data['keyword']}'相关的结果，请尝试其他关键词！")
#         return
#
#     # 格式化输出结果
#     print(f"\n✅ 搜索结果（第{page}页）".center(50, "-"))
#     for idx, item in enumerate(results, 1):
#         print(f"\n{idx}. 标题：{item['title']}")
#         print(f"   链接：{item['url']}")
#         print(f"   摘要：{item['summary']}")
#     print("\n" + "-" * 50)
#
#     # 提示下一页
#     if has_more:
#         print(f"💡 提示：输入“关键词 page={page+1}”查看下一页（如：Python page={page+1}）")
#
# # -------------------------- 3. 保留原MCP客户端通信逻辑 --------------------------
# def main_client(str_input=None):
#     # 连接服务器（IP和端口需与server.py一致）
#     host = "localhost"  # 本地测试用；若服务器在其他机器，替换为服务器IP
#     port = 8888
#
#     try:
#         # 创建TCP连接（保留原通信方式）
#         conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#         conn.connect((host, port))
#         print(f"✅ 成功连接到MCP搜索服务器（{host}:{port}）")
#         print("📌 使用说明：输入关键词搜索，输入'quit'退出")
#
#         while True:
#             # 1. 获取用户输入
#             keyword, page = get_user_input(input_user=str_input)
#             if keyword == "quit":
#                 print("👋 正在退出客户端...")
#                 break
#             if not keyword:
#                 print("❌ 请输入有效的搜索关键词！")
#                 continue
#
#             # 2. 封装搜索请求（与server.py格式对齐）
#             req = json.dumps({
#                 "type": "search",
#                 "keyword": keyword,
#                 "page": page
#             })
#
#             # 3. 发送请求给服务器
#             conn.sendall(req.encode("utf-8"))
#
#             # 4. 接收服务器响应
#             resp = conn.recv(4096).decode("utf-8")
#             if not resp:
#                 print("❌ 未收到服务器响应，请重试！")
#                 continue
#
#             # 5. 解析并展示结果
#             resp_data = json.loads(resp)
#             resp_data["keyword"] = keyword  # 补充关键词，方便展示
#             show_search_result(resp_data)
#
#     except ConnectionRefusedError:
#         print(f"❌ 无法连接到服务器（{host}:{port}），请先启动 server.py！")
#     except Exception as e:
#         print(f"❌ 客户端异常：{str(e)}")
#     finally:
#         if "conn" in locals():
#             conn.close()  # 关闭连接
#
# if __name__ == "__main__":
#     str_input = "1"
#     main_client(str_input)


import socket
import json


# -------------------------- 1. 搜索交互逻辑（替换原天气查询输入） --------------------------
def get_user_input(input_user) -> tuple[str, int]:
    """获取用户输入：解析关键词和分页（格式支持“关键词”或“关键词 page=2”）"""
    user_input = input_user
    if user_input.lower() == "quit":
        return ("quit", 1)

    # 解析分页（如“Python page=2” → 关键词=Python，页码=2）
    parts = user_input.split(" page=")
    keyword = parts[0].strip()
    page = 1  # 默认第1页
    if len(parts) == 2 and parts[1].isdigit():
        page = int(parts[1].strip())

    return (keyword, page)


# -------------------------- 2. 展示搜索结果（替换原天气展示） --------------------------
def show_search_result(resp_data: dict):
    """解析服务器响应并格式化展示结果"""
    if resp_data["status"] == "error":
        print(f"❌ 错误：{resp_data['msg']}")
        return

    results = resp_data["data"]
    page = resp_data["page"]
    has_more = resp_data["has_more"]

    if not results:
        print(f"❌ 第{page}页未找到与'{resp_data['keyword']}'相关的结果，请尝试其他关键词！")
        return

    # 格式化输出结果
    print(f"\n✅ 搜索结果（第{page}页）".center(50, "-"))
    for idx, item in enumerate(results, 1):
        print(f"\n{idx}. 标题：{item['title']}")
        print(f"   链接：{item['url']}")
        print(f"   摘要：{item['summary']}")
    print("\n" + "-" * 50)

    # 提示下一页
    if has_more:
        print(f"💡 提示：输入“关键词 page={page + 1}”查看下一页（如：Python page={page + 1}）")


# -------------------------- 3. 保留原MCP客户端通信逻辑（已修复重复打印） --------------------------
def main_client(str_input=None):
    # 连接服务器（IP和端口需与server.py一致）
    host = "localhost"  # 本地测试用；若服务器在其他机器，替换为服务器IP
    port = 8888
    is_search_done = False  # 标记固定搜索是否已执行

    try:
        # 创建TCP连接（保留原通信方式）
        conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        conn.connect((host, port))
        print(f"✅ 成功连接到MCP搜索服务器（{host}:{port}）")
        print("📌 使用说明：输入关键词搜索，输入'quit'退出")

        while True:
            # 1. 获取用户输入（直接使用传入的固定关键词）
            keyword = str_input  # 直接使用传入的关键词，无需解析
            page = 1  # 固定第1页（根据需求调整）

            if not keyword:
                print("❌ 请输入有效的搜索关键词！")
                continue

            # 2. 封装搜索请求（与server.py格式对齐）
            req = json.dumps({
                "type": "search",
                "keyword": keyword,
                "page": page
            })

            # 3. 发送请求给服务器
            conn.sendall(req.encode("utf-8"))

            # 4. 接收服务器响应
            resp = conn.recv(4096).decode("utf-8")
            if not resp:
                print("❌ 未收到服务器响应，请重试！")
                continue

            # 5. 解析并展示结果
            resp_data = json.loads(resp)
            resp_data["keyword"] = keyword  # 补充关键词，方便展示
            show_search_result(resp_data)

            # 标记为已执行，退出循环
            is_search_done = True
            break  # 只执行一次搜索

    except ConnectionRefusedError:
        print(f"❌ 无法连接到服务器（{host}:{port}），请先启动 server.py！")
    except Exception as e:
        print(f"❌ 客户端异常：{str(e)}")
    finally:
        if "conn" in locals():
            conn.close()  # 关闭连接


if __name__ == "__main__":
    str_input = "1"
    main_client(str_input)